﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using System.Xml;
using ChampionRecomendedItems.Mappers;
using System.Data.Linq.SqlClient;


namespace ChampionRecomendedItems.UI
{
    public partial class Principal : Form
    {
        #region Atributos
        private const string TITULO = "Buscar a pasta raiz do LoL";
        private const string caminhoPadrao = @"C:\Riot Games\League of Legends\";
        private List<CategoriaChampion> _listaCategoria = null;
        private List<Champion> _listaChampion = null;
        private List<int> _listaIdCategoriasSelecionadas = null;

        #endregion

        #region Construtor

        public Principal()
        {
            InitializeComponent();
        }

        #endregion

        #region Eventos

        private void Principal_Load(object sender, EventArgs e)
        {
            _listaIdCategoriasSelecionadas = new List<int>();
            this.txtCaminho.Text = caminhoPadrao;
            this.AdicionarControlesCategoria();
            this.PopularDataGrid();
        }

        /// <summary>
        /// Evento do Botão Buscar
        /// </summary>
        /// <param name="sender">o controle que dispara o evento no caso btnCaminho</param>
        /// <param name="e">os argumentos do evento</param>
        private void btnCaminho_Click(object sender, EventArgs e)
        {
            #region Declarações
            string caminho = string.Empty;
            FolderBrowserDialog objFolderBrowse = null;
            #endregion

            #region Configuração do objeto da classe FolderBrowserDialog
            objFolderBrowse = new FolderBrowserDialog();
            objFolderBrowse.ShowNewFolderButton = false;
            objFolderBrowse.Description = TITULO;
            objFolderBrowse.SelectedPath = @"C:\";
            #endregion

            DialogResult resultado = objFolderBrowse.ShowDialog(this);
            if (resultado == DialogResult.OK)
            {
                caminho = objFolderBrowse.SelectedPath;
                this.txtCaminho.Text = caminho + @"\";
            }
        }
        private void btnFiltrar_Click(object sender, EventArgs e)
        {
            this.FiltrarChampions(this.textBox1.Text);
        }


        private void chkDefaultFolder_CheckedChanged(object sender, EventArgs e)
        {
            this.txtCaminho.Text = caminhoPadrao;
            this.BloqueiaCaminho(this.chkDefaultFolder.Checked);
        }

        private void chkDinamico_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox atual = (CheckBox)sender;
            int id = Convert.ToInt32(atual.Name);
            if (atual.Checked)
                _listaIdCategoriasSelecionadas.Add(id);
            else
                _listaIdCategoriasSelecionadas.Remove(id);
            this.FiltrarChampions();
        }

        private void dgChampion_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            //Coluna 1(um) para sempre pegar o nome do champ
            this.AbrirTelaConfiguracaoChampion(this.dgChampion[1, e.RowIndex].Value.ToString());
        }

        #endregion

        #region Metodos

        private void AbrirTelaConfiguracaoChampion(string teste)
        {
            this.Visible = false;
            ConfiguracaoItemsChampion telaConfiguracao = new ConfiguracaoItemsChampion(teste, this.txtCaminho.Text);
            telaConfiguracao.ShowDialog(this);
        }

        private void FiltrarChampions()
        {
            if (_listaIdCategoriasSelecionadas.Count > 0)
            {

                var filtroChamp = (from c in this._listaChampion
                                   from o in c.Categorias
                                   join j in this._listaIdCategoriasSelecionadas on o.Id equals j
                                   select c).Distinct().ToList();

                foreach (int idAt in this._listaIdCategoriasSelecionadas)
                {
                    filtroChamp = (from c in filtroChamp
                                   from o in c.Categorias
                                   where idAt == o.Id
                                   select c).ToList();
                }

                this.dgChampion.DataSource = this.MapperChampionToDataTable(filtroChamp);
            }
            else
                this.dgChampion.DataSource = this.MapperChampionToDataTable(this._listaChampion);
        }

        private void FiltrarChampions(string nome)
        {
            var championFiltro = from champion in this._listaChampion
                                 where champion.Nome.Trim().ToUpper().Contains(nome.Trim().ToUpper())
                                 select champion;
            List<Champion> listaFiltro = new List<Champion>();
            foreach (var item in championFiltro)
            {
                listaFiltro.Add((Champion)item);
            }

            this.dgChampion.DataSource = this.MapperChampionToDataTable(listaFiltro);
        }

        private void BloqueiaCaminho(bool bloqueio)
        {
            this.btnCaminho.Enabled = !bloqueio;
        }

        private List<CategoriaChampion> CarregarListaCategoria()
        {
            XmlDocument documentoXml = null;
            List<CategoriaChampion> listaCategorias = null;
            try
            {
                documentoXml = new XmlDocument();
                documentoXml.LoadXml(Resources.categorias);
                listaCategorias = new List<CategoriaChampion>();
                CategoriaChampion categoria = new CategoriaChampion();
                int quantidadeNos = documentoXml.ChildNodes.Item(1).ChildNodes.Count;
                for (int i = 0; i < quantidadeNos; i++)
                {
                    categoria = new CategoriaChampion();
                    categoria.Id = Convert.ToInt32(documentoXml.ChildNodes.Item(1).ChildNodes.Item(i).ChildNodes.Item(0).InnerText);
                    categoria.Nome = documentoXml.ChildNodes.Item(1).ChildNodes.Item(i).ChildNodes.Item(1).InnerText;
                    listaCategorias.Add(categoria);
                }
                this._listaCategoria = listaCategorias;
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return listaCategorias;
        }

        private List<Champion> CarregarListaChampion()
        {
            XmlDocument documentoXml = new XmlDocument();
            documentoXml.LoadXml(Resources.champions);
            List<Champion> listaChampions = new List<Champion>();
            List<CategoriaChampion> listaCategoria = null;
            Champion champion = null;
            CategoriaChampion categoria = null;

            int quantidadeNos = documentoXml.ChildNodes.Item(1).ChildNodes.Count;
            int quantidadeNosCategoria = 0;
            for (int i = 0; i < quantidadeNos; i++)
            {
                champion = new Champion();
                listaCategoria = new List<CategoriaChampion>();
                champion.Id = Convert.ToInt32(documentoXml.ChildNodes.Item(1).ChildNodes.Item(i).ChildNodes.Item(0).InnerText);
                champion.Nome = documentoXml.ChildNodes.Item(1).ChildNodes.Item(i).ChildNodes.Item(1).InnerText;
                quantidadeNosCategoria = documentoXml.ChildNodes.Item(1).ChildNodes.Item(i).ChildNodes.Item(2).ChildNodes.Count;
                for (int j = 0; j < quantidadeNosCategoria; j++)
                {
                    categoria = new CategoriaChampion();
                    categoria.Id = Convert.ToInt32(documentoXml.ChildNodes.Item(1).ChildNodes.Item(i).ChildNodes.Item(2).ChildNodes.Item(j).InnerText);
                    categoria.Nome = this.BuscarNomeCategoria(categoria.Id);
                    listaCategoria.Add(categoria);
                }
                champion.Categorias = listaCategoria;

                listaChampions.Add(champion);
            }
            this._listaChampion = listaChampions;
            return listaChampions;
        }

        private void AdicionarControlesCategoria()
        {
            List<CategoriaChampion> listaCategoria = null;
            CheckBox chkDinamico = null;

            listaCategoria = this.CarregarListaCategoria();
            if (listaCategoria.Count >= 12)
            {
                MessageBox.Show("Existem mais categorias que o sistema comporta, ajuste o XML!", "Atenção!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                this.Close();
            }
            else
            {
                int posicaoVertical = 20;
                int posicaoHorizontal = 8;
                for (int contador = 0; contador < listaCategoria.Count; contador++)
                {
                    //Tres, Seis e Nove são os indices onde começa uma coluna nova
                    if (contador == 3 || contador == 6 || contador == 9)
                    {
                        posicaoVertical = 20;
                        posicaoHorizontal += 109;
                    }
                    chkDinamico = new CheckBox();
                    chkDinamico.Text = listaCategoria[contador].Nome;
                    chkDinamico.Name = listaCategoria[contador].Id.ToString();
                    chkDinamico.Location = new Point(posicaoHorizontal, posicaoVertical);
                    chkDinamico.CheckedChanged += new EventHandler(chkDinamico_CheckedChanged);
                    this.grpFiltro.Controls.Add(chkDinamico);
                    posicaoVertical += 23;
                }
            }

        }

        private DataTable MapperChampionToDataTable(List<Champion> champions)
        {
            DataTable retorno = new DataTable();
            DataRow linha = null;

            retorno.Columns.Add("Id");
            retorno.Columns.Add("Nome");
            retorno.Columns.Add("Categoria");

            foreach (Champion objChar in champions)
            {
                linha = retorno.NewRow();
                linha["Id"] = objChar.Id;
                linha["Nome"] = objChar.Nome;
                foreach (CategoriaChampion categ in objChar.Categorias)
                {
                    linha["Categoria"] += categ.Nome + "; ";
                }
                retorno.Rows.Add(linha);
            }

            return retorno;
        }

        private void PopularDataGrid()
        {
            List<Champion> listaC = this.CarregarListaChampion();
            DataTable dtPopula = this.MapperChampionToDataTable(listaC);
            this.dgChampion.DataSource = dtPopula;
        }

        private string BuscarNomeCategoria(int idCategoria)
        {
            string retorno = string.Empty;

            var retornoQuery = (from categ in _listaCategoria
                                where categ.Id == idCategoria
                                select categ.Nome).SingleOrDefault();

            return retornoQuery.ToString();
        }



        #endregion


    }
}

